// 封装转化树方法

// 思路
// 1. 方法的参数是什么 返回值是什么 - 参数平铺的数组 返回值树形数组
// 2. 数据处理逻辑(时间复杂度最小的写法)
// 核心处理思路:
// 寻找父节点的过程 通过pid字段去匹配id字段 如果能找到就把当前项放到父节点的children
// 属性里,如果找不到父节点,它自己本身就是最外层的节点 直接放到最终产出的数组中

// 代码逻辑：
// 1. 遍历要处理的数组 把数组中每一项的id作为key，对象本身作为value形成一个map对象结构
// { 1001: {}, 1002:{} }
// 2. 遍历要处理的数组 通过pid去第一步中形成的对象里寻找id进行匹配,如果匹配的上,就push到chilren属性里
// 如果匹配不上,就把当前项 push到最终产出的数组中

function transTree(arr) {
  const targetArr = []// 最终的数组
  // 进行数据处理 todo
  // 1.形成map对象结构
  const map = {}// 空对象
  arr.forEach(item => {
    map[item.id] = item// id作为键,本身作为值
    map[item.id].children = []// 每个对象添大对象添加一个children数组作为子级下面遍历要用
  })

  // 通过pid进行匹配
  arr.forEach(item => {
    if (map[item.pid]) { //
      // 因为是id现在是作为对象的键
      // 这里的pid因为跟id是一样的 所以他可以作为判断的一个依据 pid ===sax ,  id ===sax
      // sax是健名
      // 所以这个地方访问的其实父对象因为健名一致,// 也就代表是这个父对象的子级
      map[item.pid].children.push(item)// 给这个当前项push这个子节点
    } else {
      targetArr.push(item) // 如果他自己访问不到就是父节点
    }
  })
  return targetArr
}

export default transTree
